home *** CD-ROM | disk | FTP | other *** search
- /*
- * MultiMAIL offline mail reader
- *
-
- Written by Kolossvary Tamas (thomas@vma.bme.hu)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- #include "interface.h"
-
- extern mmail mm;
- extern AreaListWindow areas;
- extern LetterListWindow letters;
- extern LetterWindow letterwindow;
- extern HelpWindow helpwindow;
- extern letter_list *letterList;
- extern Interface *interface;
- extern int getstring(WINDOW *, int, int, char *, int, int, int);
-
- //************* ListWindow *****************
-
- ListWindow::ListWindow(void)
- {
- position=0;
- active=0;
- }
-
- void ListWindow :: Move(direction dir)
- {
- switch(dir)
- {
- case UP: if(position+active > 0)
- {
- active--;
- if(active == position-1)
- position--;
- }
- break;
- case DOWN: if(active+1 < NumOfItems())
- {
- active++;
- if(active-position+1 >= list_max_y)
- position++;
- }
- break;
- case PGUP: position-=list_max_y-1;
- active-=list_max_y-1;
- if(active < 0) active = 0;
- if (position < 0) position = 0;
- break;
- case PGDN: position+=list_max_y-1;
- active+=list_max_y-1;
- if(active >= NumOfItems())
- active=NumOfItems()-1;
- if(position > NumOfItems()-list_max_y)
- {
- position=NumOfItems()-list_max_y+1;
- if (position < 0) position = 0;
- }
- break;
- case HOME: active=0;
- position=0;
- break;
- case END: active=NumOfItems()-1;
- position=NumOfItems()-list_max_y+1;
- if(position < 0) position = 0;
- break;
- }
- }
-
- void ListWindow :: ReDraw(void)
- {
- touchwin(list);
- wnoutrefresh(list);
- }
-
- //**************** LETTTERLIST ****************
-
- LetterListWindow :: LetterListWindow(void)
- {
- position=0;
- active=0;
- }
-
- void LetterListWindow :: Save(void)
- {
- char filename[255];
- FILE *fd;
- WINDOW *question;
- int i;
-
- init_pair(43, COLOR_WHITE, COLOR_RED);
- init_pair(44, COLOR_YELLOW, COLOR_RED);
- question = newwin(5, 60, 10, 10);
- wattrset(question, COLOR_PAIR(43) | A_BOLD);
- for(i=0; i<5*60; i++)
- waddch(question, ' ');
- wborder(question, 0, 0, 0, 0, 0, 0, 0, 0);
- mvwaddstr(question, 1, 2, "Save to file:");
- mvwaddch(question, 2, 2, '<');
- mvwaddch(question, 2, 57, '>');
- mvwaddstr(question, 3, 30, "Ctrl-C + any key = Cancel");
- sprintf(filename, "%s%s", mm.resourceObject->get(bwSaveDir), mm.areaList->getName());
- if(getstring(question, 2, 3, filename, 54, COLOR_PAIR(43) | A_BOLD,
- COLOR_PAIR(44) | A_BOLD))
- if((fd=fopen(filename, "w")) != NULL)
- {
- for(i=1; i <= mm.areaList->getNoOfLetters(); i++)
- {
- letterList->gotoLetter(i);
- letterwindow.write_to_file(fd);
- }
- fclose(fd);
- }
- delwin(question);
- touchwin(screen);
- wnoutrefresh(screen);
- touchwin(list);
- Draw();
- helpwindow.redraw();
- }
-
- void LetterListWindow::FirstUnread(void)
- {
- int i;
-
- position=0;
- active=0;
- for(i=0; i<NumOfItems(); i++)
- {
- letterList->gotoLetter(i+1);
- if(letterList->getRead())
- {
- Move(DOWN);
- Draw();
- doupdate();
- }
- else
- i=NumOfItems();
- }
- Draw();
- }
-
- int LetterListWindow::NumOfItems(void)
- {
- return mm.areaList->getNoOfLetters();
- }
-
- void LetterListWindow::Draw(void)
- {
- int i;
- char *tmp;
-
- init_pair(26, COLOR_WHITE, COLOR_BLUE);
- tmp = new char[COLS-47];
- tmp[COLS-48]='\0';
- for(i=1; i<list_max_y; i++)
- {
- int x,y;
-
- letterList->gotoLetter(position+i);
- wattrset(list, COLOR_PAIR(26) | A_NORMAL);
- if(!letterList->getRead()) wattron(list, A_BOLD);
- if(position+i-1 == active) wattron(list, A_REVERSE);
- mvwprintw(list, i+1, 1, " %5d", letterList->getLetterID());
- mvwprintw(list, i+1, 7, " %-16s", letterList->getFrom());
- mvwprintw(list, i+1, 23, " %-16s", letterList->getTo());
- strncpy(tmp, letterList->getSubject(), COLS-58);
- mvwprintw(list, i+1, 38, " %s", tmp);
- getyx(list, y, x);
- if(mm.areaList->getType() == bwrep)
- {
- while(x < COLS-20)
- mvwaddch(list, y, x++, ' ');
- mvwprintw(list, i+1, COLS-20, " %-14s", mm.areaList->getName(letterList->getAreaID()));
- }
- else
- {
- while(x < COLS-5)
- mvwaddch(list, y, x++, ' ');
- }
- if((position+i) == NumOfItems()) i=list_max_y;
- }
- delete tmp;
- wnoutrefresh(list);
- }
-
- void LetterListWindow::MakeActive(void)
- {
- int i;
-
- areas.Reset_areaList();
- if(NumOfItems() < LINES-11)
- list_max_y = NumOfItems() + 1;
- else list_max_y = LINES - 10;
- list=newwin(list_max_y + 2, COLS - 4, 2, 2);
- init_pair(21, COLOR_YELLOW, COLOR_BLUE);
- init_pair(22, COLOR_WHITE, COLOR_BLUE);
- init_pair(23, COLOR_GREEN, COLOR_BLUE);
- init_pair(25, COLOR_YELLOW, COLOR_BLUE);
- wattrset(list, COLOR_PAIR(21) | A_BOLD);
-
- for(i=0; i<(LINES-8)*(COLS-4); i++)
- waddch(list, ' ');
- wborder(list, 0, 0, 0, 0, 0, 0, 0, 0);
- mvwaddch(list, 0, 2, ACS_RTEE);
- wattrset(list, COLOR_PAIR(22) | A_BOLD);
- waddstr(list, "Letters in ");
- wattrset(list, COLOR_PAIR(23) | A_BOLD);
- wprintw(list, "%s", mm.areaList->getDescription());
- wattrset(list, COLOR_PAIR(21) | A_BOLD);
- waddch(list, ACS_LTEE);
- wattrset(list, COLOR_PAIR(25) | A_BOLD);
- mvwaddstr(list, 1, 3, "MSG# From To Subject");
- if(mm.areaList->getType() == bwrep)
- mvwaddstr(list, 1, COLS-19, "Area");
- wnoutrefresh(list);
-
- helpwindow.letterlist();
- }
-
- void LetterListWindow::Delete(void)
- {
- letterList->gotoLetter(active+1);
- delwin(list);
- helpwindow.Delete();
- touchwin(screen);
- wnoutrefresh(screen);
- }
-
- //****************************************************************************
- //* *
- //* LETTERWINDOW *
- //* *
- //****************************************************************************
-
- Line :: Line(void)
- {
- next = NULL;
- }
-
- net_address LetterWindow :: PickNetAddr(void)
- {
- unsigned int i;
- Line *line;
- net_address result;
-
- line = head.next;
- while(strncmp(" * Origin:", line->text, 10) != 0)
- line = line->next;
- //we have the Origin line
-
- i = strlen(line->text);
- while(((line->text[i-1]) != '(') && i > 0)
- i--;
- //we have the opening bracket
-
- while((i < strlen(line->text)) && ((line->text[i]<'0') || (line->text[i]>'9')))
- i++;
- //we have the begining of the address
-
- if(sscanf(&line->text[i], "%d:%d/%d.%d", &result.zone,
- &result.net,
- &result.node,
- &result.point) == 3)
- result.point = 0;
-
- return result;
- }
-
- void LetterWindow :: set_columns(int arg)
- {
- columns = arg;
- }
-
- void LetterWindow :: ReDraw(void)
- {
- touchwin(header);
- wnoutrefresh(header);
- touchwin(text);
- wnoutrefresh(text);
- }
-
- void LetterWindow :: DestroyChain (void)
- {
- Line *tmp;
-
- curr = head.next;
- while(curr != NULL)
- {
- delete curr->text;
- tmp = curr;
- curr = curr->next;
- delete tmp;
- }
- head.next = NULL;
- letter_in_chain = 0;
- NumOfLines = 0;
- }
-
- void LetterWindow :: MakeChain (void)
- {
- char *message;
- int end = 0;
- int j = 0; //pointer in the text
- int k; //pointer in the line
- int begin; //pointer to the begining of the last word
-
- DestroyChain();
- message = (char *)letterList->getBody();
- letter_in_chain = letterList->getLetterID();
- curr = &head;
-
- while(!end)
- {
- //new line
- curr->next = new Line;
- curr = curr->next;
- curr->text = new char[columns + 1]; //+1 for the '\0'
- NumOfLines++;
-
- begin = 0;
- k = 0;
- while((message[j] != 13) && (message[j] != 10) && (!end) && (k < columns))
- {
- if((begin == 0) && (message[j] != ' '))
- begin = j;
- if(message[j] == ' ')
- begin = 0;
- if(message[j] != '\0')
- {
- //put character to its place
- curr->text[k] = message[j];
- j++;
- k++;
- }
- else
- end = 1;
- }
- if(k == columns && begin != 0 && (j-begin) < columns)
- {
- //we must go back to 'begin'
- k-= j - begin;
- j = begin;
-
- }
- if((message[j] == 10) || (message[j] == 13)) j++;//to omit the '\n'
- if((message[j-1] == 13) && (message[j] == 10)) j++;
- curr->text[k] = '\0';
- }
- }
-
- void LetterWindow :: Draw()
- {
- unsigned int i, j;
- char test;
-
- if(letter_in_chain != letterList->getLetterID())
- MakeChain();
- letterList->setRead();
- touchwin(text);
- init_pair(32, COLOR_BLUE, COLOR_BLACK);
- init_pair(33, COLOR_CYAN, COLOR_BLACK);
- init_pair(34, COLOR_YELLOW, COLOR_RED);
- init_pair(35, COLOR_RED, COLOR_BLACK);
- init_pair(36, COLOR_GREEN, COLOR_BLACK);
- init_pair(37, COLOR_MAGENTA, COLOR_BLACK);
- init_pair(38, COLOR_WHITE, COLOR_BLACK);
- wattrset(header, COLOR_PAIR(32) | A_BOLD);
- wmove(header, 0, 0);
- for(i=0; i<(unsigned int)(4*(columns-2)); i++)
- waddch(header, ' ');
- mvwaddstr(header, 0, 2, "MSG#:");
- mvwaddstr(header, 1, 2, "From:");
- mvwaddstr(header, 2, 2, " To:");
- mvwaddstr(header, 3, 2, "Subj:");
- mvwaddstr(header, 0, COLS-33, "Date:");
- wattrset(header, COLOR_PAIR(35));
- mvwprintw(header, 0, 8, "%d of %d", letterList->getLetterID(),
- mm.areaList->getNoOfLetters());
- mvwprintw(header, 3, COLS-15, "%5d%c%-5d", position + 1, '/', NumOfLines - 1);
- wattrset(header, COLOR_PAIR(36));
- mvwaddstr(header, 1, 8, (char *)letterList->getFrom());
- wattrset(header, COLOR_PAIR(33));
- mvwaddstr(header, 2, 8, (char *)letterList->getTo());
- wattrset(header, COLOR_PAIR(36) | A_BOLD);
- mvwaddstr(header, 3, 8, (char *)letterList->getSubject());
- mvwaddstr(header, 0, COLS-27, (char *)letterList->getDate());
-
- wnoutrefresh(header);
-
- //find positionth Line
- curr = head.next;
- for(i = 0; i < position; i++)
- curr = curr->next;
- for(i = 1; i <= (unsigned int)y; i++)
- if(curr != NULL)
- {
- wattrset(text, COLOR_PAIR(36));
- for(int m=0; m<5; m++)
- if(curr->text[m] == '>') //quoting
- wattrset(text, COLOR_PAIR(33));
- test = curr->text[0];
- if((curr->text[1] == test) && (curr->text[2] == test) &&
- ((curr->text[3] == ' ') || (curr->text[3] == '\r')))
- switch(test)
- {
- case '.': wattrset(text, COLOR_PAIR(37) |
- A_BOLD); //tagline
- break;
- case '-': wattrset(text, COLOR_PAIR(35));
- //mailer prog
- break;
- case '~': wattrset(text, COLOR_PAIR(35));
- //mailer prog
- break;
- }
- else if((strncmp(curr->text, " * Origin:", 10)) == 0)
- wattrset(text, COLOR_PAIR(38) | A_BOLD); //origin line
-
- mvwprintw(text, i, 0, "%-80s", curr->text);
- curr = curr->next;
- }
- else
- for(j = 0; j < (unsigned int)x; j++)
- mvwaddch(text, i, j, ' ');
- wattrset(text, COLOR_PAIR(34) | A_BOLD);
- mvwprintw(text, LINES-6, 0, " %-71s",
- mm.areaList->getDescription());
- for(i=0; i<(unsigned int)(columns-79); i++) waddch(text, ' ');
- waddstr(text, "F1-Help");
-
- wnoutrefresh(text);
- }
-
- void LetterWindow :: MakeActive(void)
- {
- int i;
-
- init_pair(31, COLOR_BLUE, COLOR_BLACK);
-
- DestroyChain();
- header=newwin(4, COLS-2, 1, 1);
- text=newwin(LINES-5, COLS, 5, 0);
- wattrset(text, COLOR_PAIR(31) | A_BOLD);
- for(i=0; i<((LINES-5)*(COLS)); i++)
- waddch(text, ' ');
- mvwaddch(text, 0, 0, ACS_LLCORNER);
- whline(text, ACS_HLINE, COLS-2);
- mvwaddch(text, 0, COLS-1, ACS_LRCORNER);
-
- getmaxyx(text, y, x);
- y-=2; //the border and the status line
- position = 0;
- Draw();
- }
-
- void LetterWindow :: Next(void)
- {
- if(letterList->getLetterID() < mm.areaList->getNoOfLetters())
- {
- letters.Move(DOWN);
- letterList->gotoLetter(letterList->getLetterID() + 1);
- position=0;
- Draw();
- }
- else
- {
- interface->back();
- doupdate();
- interface->back();
- doupdate();
- interface->DOWN_ARROW();
- }
- }
-
- void LetterWindow :: Previous(void)
- {
- if(letterList->getLetterID() > 1)
- {
- letters.Move(UP);
- letterList->gotoLetter(letterList->getLetterID() - 1);
- position=0;
- Draw();
- }
- else
- {
- interface->back();
- doupdate();
- interface->back();
- doupdate();
- interface->UP_ARROW();
- }
- }
-
- void LetterWindow :: Move(direction dir)
- {
- switch(dir)
- {
- case UP: if(position > 0)
- {
- position--;
- Draw();
- }
- break;
- case DOWN: if(position < NumOfLines - 2)
- {
- position++;
- Draw();
- }
- break;
- case HOME: position = 0; Draw(); break;
- case END: position = NumOfLines - 2;
- Draw();
- break;
- case PGUP: if((unsigned int)y < position)
- position-=y;
- else
- position = 0;
- Draw();
- break;
- case PGDN: position+=y;
- if(position > NumOfLines - 2)
- position = NumOfLines - 2;
- Draw();
- break;
- }
- }
-
- void LetterWindow :: Delete(void)
- {
- if(header != NULL) delwin(header);
- if(text != NULL) delwin(text);
- touchwin(screen);
- wnoutrefresh(screen);
- }
-
- void LetterWindow :: Save(void)
- {
- char filename[255];
- WINDOW *question;
- FILE *fd;
-
- init_pair(43, COLOR_WHITE, COLOR_RED);
- init_pair(44, COLOR_YELLOW, COLOR_RED);
- question = newwin(5, 60, 10, 10);
- wattrset(question, COLOR_PAIR(43) | A_BOLD);
- for(int i=0; i<5*60; i++)
- waddch(question, ' ');
- wborder(question, 0, 0, 0, 0, 0, 0, 0, 0);
- mvwaddstr(question, 1, 2, "Save to file:");
- mvwaddch(question, 2, 2, '<');
- mvwaddch(question, 2, 57, '>');
- mvwaddstr(question, 3, 30, "Ctrl-C + any key = Cancel");
- sprintf(filename, "%s%s%c%d", mm.resourceObject->get(bwSaveDir),
- mm.areaList->getName(), '.', letterList->getLetterID());
- if(getstring(question, 2, 3, filename, 54, COLOR_PAIR(43) | A_BOLD,
- COLOR_PAIR(44) | A_BOLD))
- if((fd=fopen(filename, "w")) == NULL)
- {
- #ifdef SOUND_EFFECTS
- system("zcat /var/lib/mmail/ohno.wav >/dev/dsp &");
- #endif
- }
- else
- {
- write_to_file(fd);
- fclose(fd);
- }
- delwin(question);
- Draw();
- }
-
- void LetterWindow :: set_Letter_Params(net_address *nm, char to[30])
- {
- NM.zone = nm->zone;
- NM.net = nm->net;
- NM.node = nm->node;
- NM.point = nm->point;
- if(to != NULL)
- strncpy(To, to, 29);
- else
- To[0] = '\0';
- }
-
- void LetterWindow :: set_Letter_Params(int area, char param_key)
- {
- key = param_key;
- if(key == 'N')
- {
- //find netmail area
- int i=1;
- while((i <= mm.areaList->noOfAreas()) &&
- (strcmp(mm.areaList->getShortName(), "NET") != 0))
- mm.areaList->gotoArea(i++);
- if(strcmp(mm.areaList->getShortName(), "NET") == 0)
- replyto_area = mm.areaList->getAreaNo();
- else
- {
- //netmail area not found, we should warn the user
- }
- areas.Reset_areaList();
- }
- else
- replyto_area = area;
- }
-
- void LetterWindow :: EnterLetter(void)
- {
- WINDOW *rep_header;
- char tmp_filename[255];
- FILE *tmp;
- char reply_filename[255];
- char command[255];
- char FROM[21];
- char TO[21];
- char SUBJ[72];
- char TMP[21];
- char mg[4];
- FILE *reply;
- int end, i;
- TaglineWindow *taglines;
-
- init_pair(53, COLOR_WHITE, COLOR_BLUE);
- init_pair(54, COLOR_CYAN, COLOR_BLUE);
- init_pair(55, COLOR_GREEN, COLOR_BLUE);
-
- rep_header = newwin(5, COLS-2, (LINES/2)-3, 1);
- wattrset(rep_header, COLOR_PAIR(53) | A_BOLD);
- for(i=0; i<5*(COLS-2); i++)
- waddch(rep_header, ' ');
- box(rep_header, 0, 0);
- mvwaddstr(rep_header, 1, 2, "From:");
- mvwaddstr(rep_header, 2, 2, " To:");
- mvwaddstr(rep_header, 3, 2, "Subj:");
- wrefresh(rep_header);
-
- mm.areaList->gotoArea(replyto_area);
- strcpy(FROM, mm.resourceObject->get(bwAliasName));
- if(strcmp(mm.areaList->getShortName(), "NET") != 0)
- getstring(rep_header, 1, 8, FROM, 20, COLOR_PAIR(55), COLOR_PAIR(55));
- else
- mvwaddstr(rep_header, 1, 8, FROM);
- if((key == 'R') || (key == 'N'))
- strcpy(TO, letterList->getFrom());
-
- if(key == 'O')
- strcpy(TO, letterList->getTo());
-
- if(key == 'E')
- {
- if(To[0] == '\0')
- strcpy(TO, "ALL");
- else
- strcpy(TO, To);
- SUBJ[0]='\0'; //we don't have subject yet
- }
- else
- strcpy(SUBJ, letterList->getSubject());
-
-
- if(strcmp(mm.areaList->getShortName(), "NET") != 0)
- getstring(rep_header, 2, 8, TO, 20, COLOR_PAIR(54), COLOR_PAIR(54));
- else if(NM.point)
- mvwprintw(rep_header, 2, 8, "%s (%d:%d/%d.%d)", TO,
- NM.zone,
- NM.net,
- NM.node,
- NM.point);
- else
- mvwprintw(rep_header, 2, 8, "%s (%d:%d/%d)", TO,
- NM.zone,
- NM.net,
- NM.node);
- getstring(rep_header, 3, 8, SUBJ, 69, COLOR_PAIR(55) | A_BOLD,
- COLOR_PAIR(55) | A_BOLD);
- delwin(rep_header);
-
- sprintf(reply_filename, "%s%s%s", "/tmp/", getenv("LOGNAME"), "/reply.txt");
- reply=fopen(reply_filename, "w");
- if(key == 'E')
- fclose(reply); //this was only delete the file
- else
- {
- fprintf(reply, "\n -=> %s wrote to %s <=-\n\n", letterList->getFrom(),
- letterList->getTo());
- fclose(reply);
- sprintf(tmp_filename, "%s%s%s", "/tmp/", getenv("LOGNAME"), "/tmp.txt");
- if((tmp=fopen(tmp_filename, "w")) != NULL)
- {
- columns = 75;
- write_to_file(tmp, 0);
- columns = COLS;
- fclose(tmp);
- MakeChain();
- }
- strncpy(mg, letterList->getFrom(), 2);
- mg[2]='\0'; mg[3]='\0';
- strcpy(TMP, letterList->getFrom());
- i=1;
- for(int j=1; j<3; j++)
- {
- end=0;
- while((TMP[i] != '\0') && !end)
- {
- if((TMP[i-1] == ' ') && (TMP[i] != ' '))
- {
- mg[j]=TMP[i];
- if(j==1) end=1;
- }
- i++;
- }
- }
- sprintf(command, "%s%s%s%s%s%s", "sed 's/^/ ", mg, "> /' ", tmp_filename,
- " >> ", reply_filename);
- system(command);
- }
- sprintf(command, "%s %s", mm.resourceObject->get(editor), reply_filename);
- leaveok(stdscr, FALSE);
- refresh();
- system(command);
- keypad(screen, TRUE);
- leaveok(stdscr, TRUE);
- touchwin(stdscr);
- refresh();
- touchwin(screen);
- wnoutrefresh(screen);
- switch(interface->active())
- {
- case packetlist: break;
- case arealist: areas.ReDraw(); break;
- case letterlist: letters.ReDraw(); break;
- case threadlist: break;
- case letter: letterwindow.ReDraw(); break;
- case letter_help: break;
- case littlearealist: break;
- }
-
- /* place tagline after the text */
-
- tagline[0] = '\0';
- taglines = new TaglineWindow;
- if(tagline[0] != '\0')
- {
- reply=fopen(reply_filename, "a+");
- fseek(reply, -1, SEEK_CUR);
- if(fgetc(reply) != '\n')
- fputc('\n', reply);
- fprintf(reply, "... %s\n", tagline);
- fclose(reply);
- }
-
- if(strcmp(mm.areaList->getShortName(), "NET") == 0)
- {
- mm.areaList->enterLetter(replyto_area, FROM, TO, SUBJ, 0, 0, &NM);
- }
- else
- mm.areaList->enterLetter(replyto_area, FROM, TO, SUBJ, 0, 0, NULL);
- areas.Reset_areaList();
- To[0] = '\0';
- }
-
- void LetterWindow :: set_Tagline(char *tl)
- {
- strncpy(tagline, tl, 76);
- }
-
- void LetterWindow :: write_to_file(FILE *fd, int NEED_HEADER)
- {
- int j;
-
- if(NEED_HEADER)
- { //write header to file
- fputc('\n', fd);
- for(j=0; j<COLS; j++)
- fputc('=', fd);
- fprintf(fd, "\n From: %s\n To: %s\n Subj: %s\n",
- letterList->getFrom(), letterList->getTo(), letterList->getSubject());
- for(j=0; j<COLS; j++)
- fputc('-', fd);
- fputc('\n', fd);
- }
- //write chain to file
- MakeChain();
- curr = head.next;
- while(curr != NULL)
- {
- fprintf(fd, "%s\n", curr->text);
- curr = curr->next;
- }
- }
-